package com.huamao.zh.base;

import java.util.Date;
import java.util.Random;

import org.apache.commons.lang3.StringUtils;

/**
 * 编号、序列号等单号生成规则
 */
public class SerialNumberUtils {

	private final static String ACCESSSYSTEM_SYSTEMCODE_PREFIX = "AS";
	private final static String CHANNELRULE_RULECODE_PREFIX = "CR";
	private final static String CHANNEL_CODE_PREFIX = "CH";
	private final static String PAY_WITHDRAW_NO = "WN";
	private final static String PAY_RECORD_NO = "RN";
	private final static String PAY_CLIENT_MERCHANT_ACCOUNT = "MERA";
	private final static String PAY_CLIENT_MERCHANT = "MER";

	private SerialNumberUtils() {

	}

	/**
	 * 生成 AccessSystem 中的 systemCode 张秀春 2017-9-10
	 *
	 * @return
	 */
	public static String generateSystemCode() {
		return ACCESSSYSTEM_SYSTEMCODE_PREFIX
				+ DateUtils.convertFormatDateToString(DateUtils.DATE_FORMAT_YMDHMS_SSS, new Date());
	}

	/**
	 * 生成 Channel 中的 code 张秀春 2017-9-10
	 *
	 * @return
	 */
	public static String generateChannelCode() {
		return CHANNEL_CODE_PREFIX + DateUtils.convertFormatDateToString(DateUtils.DATE_FORMAT_YMDHMS_SSS, new Date());
	}

	/**
	 * 生成 ChannelRule 中的 ruleCode 张秀春 2017-9-10
	 *
	 * @return
	 */
	public static String generateRuleCode() {
		return CHANNELRULE_RULECODE_PREFIX
				+ DateUtils.convertFormatDateToString(DateUtils.DATE_FORMAT_YMDHMS_SSS, new Date());
	}

	/**
	 * 生成 Record 中的 recordNo .流水号到毫秒级别 张秀春 2017-9-10
	 *
	 * @return
	 */
	public static String generateRecordNo() {
		return PAY_RECORD_NO + DateUtils.convertFormatDateToString(DateUtils.DATE_FORMAT_YMDHMS_SSS, new Date());
	}

	/**
	 * 生成 MerchantAccount 中的 merchantAccountId 账号到毫秒级 张秀春 2017-10-9
	 *
	 * @return
	 */
	public static String generateMerchantAccountId() {
		return PAY_CLIENT_MERCHANT_ACCOUNT
				+ DateUtils.convertFormatDateToString(DateUtils.DATE_FORMAT_YMDHMS_SSS, new Date());
	}

	/**
	 * 生成 Merchant 中的 MerchantId 商户号到毫秒级 张秀春 2017-10-9
	 *
	 * @return
	 */
	public static String generateMerchantId() {
		return PAY_CLIENT_MERCHANT + DateUtils.convertFormatDateToString(DateUtils.DATE_FORMAT_YMDHMS_SSS, new Date());
	}

	/**
	 * 生成 Record 中的 withdrawNo 流水号到毫秒级 张秀春 2017-9-10
	 *
	 * @return
	 */
	public static String generateWithdrawNo() {
		return PAY_WITHDRAW_NO + DateUtils.convertFormatDateToString(DateUtils.DATE_FORMAT_YMDHMS_SSS, new Date());
	}

	public static String generateJPBillNo(String pre) {
		return pre + DateUtils.convertFormatDateToString(DateUtils.DATE_FORMAT_YMDHMS, new Date())
				+ (int) (Math.random() * 90 + 10);
	}

	/**
	 * 功能说明：华汉驼帮统一订单号生成工具类 Author：spring Date：2017/11/20 10:25
	 */
	public static String generateOrderNo(String prefix) {
		String orderNo = prefix;
		synchronized (SerialNumberUtils.class) {
			orderNo += DateUtils.convertFormatDateToString(DateUtils.DATE_FORMAT_YMDHMS, new Date())
					+ generateRandomNo(5);
		}
		return orderNo;
	}

	/**
	 * 功能说明：生成安全的随机数 Author：spring Date：2017/11/20 10:58
	 */
	public static String generateRandomNo(Integer num) {
		int[] array = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
		Random rand = new Random();
		for (int i = 10; i > 1; i--) {
			int index = rand.nextInt(i);
			int tmp = array[index];
			array[index] = array[i - 1];
			array[i - 1] = tmp;
		}
		int result = 0;
		for (int i = 0; i < num; i++)
			result = result * 10 + array[i];
		String tmp = result + "";
		int length = tmp.length();
		if (length < num) {
			tmp = StringUtils.repeat("0", num - length) + tmp;
		}
		return tmp;
	}

}
